/*
 * ST7789.c
 *
 *  Created on: 2023年12月22日
 *      Author: Administrator
 */

#include "common_api.h"
#include "Font.h"
_lcd_dev lcddev;
uint8_t DFT_SCAN_DIR;
//画笔颜色和背景颜色
uint16_t POINT_COLOR = WHITE; //画笔
uint16_t BACK_COLOR = BLACK;  //背景
void ST7789_Init(void)
{

    ScreenReset_HIGH;
    Delay_ms (10);  //10ms
    ScreenReset_LOW;
    Delay_ms (20);
    ScreenReset_HIGH;
    ScreenRD_HIGH;

    //---------------------------------------------------------------------------------------------------//
    ST7789_WRReg (0x11);
    Delay_ms (120); //Delay 120ms
    //------------------------------display and color format setting--------------------------------//
//    ST7789_WRReg(0x36);             //Memory Data Access Control
//    ST7789_WRData(0x08);
    ST7789_WRReg (0x3a);             //Interface Pixel Format
    ST7789_WRData (0x05);            // 根据手册设置
    //--------------------------------ST7789S Frame rate setting----------------------------------//
    ST7789_WRReg (0xb2);             //Porch Setting
    ST7789_WRData (0x0c);            //背面入口
    ST7789_WRData (0x0c);            //正面入口
    ST7789_WRData (0x00);            //使入口设置有效
    ST7789_WRData (0x33);
    ST7789_WRData (0x33);
    ST7789_WRReg (0xb7);
    ST7789_WRData (0x35);
    //---------------------------------ST7789S Power setting--------------------------------------//
    ST7789_WRReg (0xbb);             // VCOM Setting
    ST7789_WRData (0x28);
    ST7789_WRReg (0xc0);
    ST7789_WRData (0x2c);
    ST7789_WRReg (0xc2);
    ST7789_WRData (0x01);
    ST7789_WRReg (0xc3);
    ST7789_WRData (0x10);
    ST7789_WRReg (0xc4);
    ST7789_WRData (0x20);
    ST7789_WRReg (0xc6);
    ST7789_WRData (0x0f);
    ST7789_WRReg (0xd0);
    ST7789_WRData (0xa4);
    ST7789_WRData (0xa1);
    //--------------------------------ST7789S gamma setting---------------------------------------//
    ST7789_WRReg (0xe0);
    ST7789_WRData (0xd0);
    ST7789_WRData (0x00);
    ST7789_WRData (0x02);
    ST7789_WRData (0x07);
    ST7789_WRData (0x0a);
    ST7789_WRData (0x28);
    ST7789_WRData (0x32);
    ST7789_WRData (0x44);
    ST7789_WRData (0x42);
    ST7789_WRData (0x06);
    ST7789_WRData (0x0e);
    ST7789_WRData (0x12);
    ST7789_WRData (0x14);
    ST7789_WRData (0x17);
    ST7789_WRReg (0xe1);
    ST7789_WRData (0xd0);
    ST7789_WRData (0x00);
    ST7789_WRData (0x02);
    ST7789_WRData (0x07);
    ST7789_WRData (0x0a);
    ST7789_WRData (0x28);
    ST7789_WRData (0x31);
    ST7789_WRData (0x54);
    ST7789_WRData (0x47);
    ST7789_WRData (0x0e);
    ST7789_WRData (0x1c);
    ST7789_WRData (0x17);
    ST7789_WRData (0x1b);
    ST7789_WRData (0x1e);
    ST7789_WRReg (0x29);

    ST7789_WRReg (0x21);     //翻转颜色

    LCD_Display_Dir (1);         //默认竖屏
    LCD_Clear (BACK_COLOR);
}
/**
 * 向端口写八位
 * @param Byte
 */
void Screen_WByte(uint8_t Byte)
{
    uint16_t temp = (uint16_t)Byte;
	temp =(temp <<8) &0xFFFF;
	GPIO_SET_OUT_DATA(PA,temp);
//	if(Byte&0x01)
//	{
//		PA8 =1;
//	}
//	else 
//	{
//		PA8 =0;
//	}
//	if(Byte&0x02)
//	{
//		PA9 =1;
//	}
//	else 
//	{
//		PA9 =0;
//	}
//	if(Byte&0x04)
//	{
//		PA10 =1;
//	}
//	else 
//	{
//	PA10 =0;
//	}
//		if(Byte&0x08)
//	{
//		PA11 =1;
//	}
//	else 
//	{
//	PA11 =0;
//	}
//		if(Byte&0x10)
//	{
//		PA12 =1;
//	}
//	else 
//	{
//	PA12 =0;
//	}
//		if(Byte&0x20)
//	{
//		PA13 =1;
//	}
//	else 
//	{
//		PA13 =0;
//	}
//	if(Byte&0x40)
//	{
//		PA14 =1;
//	}
//	else 
//	{
//	PA14 =0;
//	}
//		if(Byte&0x80)
//	{
//	PA15 =1;
//	}
//	else 
//	{
//		PA15 =0;
//	}

}
/**
 * 读端口
 * @return
 */
uint8_t Screen_RByte(void)
{
    uint16_t Data;
    GPIO_GET_IN_DATA (PA);
	Data = (PA15<<7) | (PA14<<6)|(PA13<<5)|(PA12<<4)|(PA11<<3)|(PA10<<2) |(PA9<<1) | PA8 ;
    return (uint8_t) Data;
}
/**
 * 写8位数据
 * @param Value
 */
void ST7789_WRData(uint8_t Value)
{
    ScreenRS_HIGH; //1数据 0指令
    ScreenCS_LOW;   //片选低有效
    Screen_WByte (Value);
    ScreenWR_LOW;   //上升沿写入数据
	Delay_us(10);
    ScreenWR_HIGH;
    ScreenCS_HIGH;
}
/**
 * 写8位寄存器地址
 * @param Byte
 */
void ST7789_WRReg(uint8_t Byte)
{
    ScreenRS_LOW;
    ScreenCS_LOW;
    Screen_WByte (Byte);
    ScreenWR_LOW;
	Delay_us(10);
    ScreenWR_HIGH;
    ScreenCS_HIGH;
}
/**
 * 向寄存器地址写入16位数据
 * @param LCD_Reg
 * @param Value
 *
 */
void ST7789_WriteToReg(uint8_t LCD_Reg, uint8_t Value)
{
    ST7789_WRReg (LCD_Reg);
    ST7789_WRData (Value);
}
/**
 * 读
 * @return
 * 用不到就没写完
 */
uint8_t ST7789_ReadByte(void)
{
    uint8_t Byte;
    ScreenCS_LOW;
    ScreenRD_LOW;
    Byte = Screen_RByte ();
    ScreenRD_HIGH;
    ScreenCS_HIGH;
    return Byte;
}
/**
 *提供寄存器地址
 */
void ST7789_WriteRAM_Start(void)
{
    ST7789_WRReg (lcddev.wramcmd);
}
/**
 * 向RAM写入16位的数据
 * @param RGB_Code
 */
void LCD_WriteRAM(uint16_t RGB_Code)
{
    ScreenRS_HIGH; //1数据 0指令
    ScreenCS_LOW;   //片选低有效
    Screen_WByte ((uint8_t) (RGB_Code >> 8));
    ScreenWR_LOW;   //上升沿写入数据
    ScreenWR_HIGH;

    Screen_WByte ((uint8_t) (RGB_Code & 0X00ff));
    ScreenWR_LOW;   //上升沿写入数据
    ScreenWR_HIGH;
    ScreenCS_HIGH;
}
///**
// * 向RAM写入16位的数据
// * @param RGB_Code
// */
//void LCD_WriteRAM(uint32_t RGB_Code)
//{
//    ScreenRS_HIGH; //1数据 0指令
//    ScreenCS_LOW;   //片选低有效
//    Screen_WByte(RGB_Code>>16);
//    ScreenWR_LOW;   //上升沿写入数据
//    ScreenWR_HIGH;
//    Screen_WByte(RGB_Code>>8);
//    ScreenWR_LOW;   //上升沿写入数据
//    ScreenWR_HIGH;
//    Screen_WByte(RGB_Code&0X0000ff);
//    ScreenWR_LOW;   //上升沿写入数据
//    ScreenWR_HIGH;
//    ScreenCS_HIGH;
//}
/**
 * 设置光标的位置
 * @param Xpos
 * @param Ypos
 */
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
{
    ST7789_WRReg (lcddev.setxcmd);
    ST7789_WRData (Xpos >> 8);
    ST7789_WRData (Xpos & 0xFF);

    ST7789_WRReg (lcddev.setycmd);
    ST7789_WRData (Ypos >> 8);
    ST7789_WRData (Ypos & 0xFF);
}
/**
 * 设置LCD自动扫描 方向
 * 其他函数可能会受到此函数影响（9341/6804尤其是这俩）
 * @param dir
 */
void LCD_Scan_Dir(uint8_t dir)
{
    uint16_t regval = 0;
    uint8_t dirreg = 0;
    switch (dir)
    //方向设置
    {
        case 0:
            dir = 6;
        break;
        case 1:
            dir = 7;
        break;
        case 2:
            dir = 4;
        break;
        case 3:
            dir = 5;
        break;
        case 4:
            dir = 1;
        break;
        case 5:
            dir = 0;
        break;
        case 6:
            dir = 3;
        break;
        case 7:
            dir = 2;
        break;
    }
    switch (dir)
    {
        case L2R_U2D:   //从左到右，从上到下
            regval |= (0 << 7) | (0 << 6) | (0 << 5);
        break;
        case L2R_D2U:   //从左到右，从下到上
            regval |= (1 << 7) | (0 << 6) | (0 << 5);
        break;
        case R2L_U2D:   //从右到左，从上到下
            regval |= (0 << 7) | (1 << 6) | (0 << 5);
        break;
        case R2L_D2U:   //从右到左，从下到上
            regval |= (1 << 7) | (1 << 6) | (0 << 5);
        break;
        case U2D_L2R:   //从上到下，从左到右
            regval |= (0 << 7) | (0 << 6) | (1 << 5);
        break;
        case U2D_R2L:   //从上到下，从右到左
            regval |= (0 << 7) | (1 << 6) | (1 << 5);
        break;
        case D2U_L2R:   //从下到上，从左到右
            regval |= (1 << 7) | (0 << 6) | (1 << 5);
        break;
        case D2U_R2L:   //从下到上，从右到左
            regval |= (1 << 7) | (1 << 6) | (1 << 5);
        break;
    }
    dirreg = 0X36;
    regval |= 0x00;
    ST7789_WriteToReg (dirreg, regval); //向lcd方向寄存器写数据；

    ST7789_WRReg (lcddev.setxcmd);
    ST7789_WRData (0);
    ST7789_WRData (0);
    ST7789_WRData ((lcddev.width - 1) >> 8);
    ST7789_WRData ((lcddev.width - 1) & 0XFF);
    ST7789_WRReg (lcddev.setycmd);
    ST7789_WRData (0);
    ST7789_WRData (0);
    ST7789_WRData ((lcddev.height - 1) >> 8);
    ST7789_WRData ((lcddev.height - 1) & 0XFF);
}
/**
 * 点填充
 * @param x
 * @param y
 */
void LCD_DrawPoint(uint16_t x, uint16_t y)
{
    LCD_SetCursor (x, y);     //设置光标位置
    ST7789_WriteRAM_Start (); //写入GRAM
    LCD_WriteRAM (POINT_COLOR);
}
/**
 * 屏幕显示方向
 * @param dir
 */
void LCD_Display_Dir(uint8_t dir)
{
    if (dir == 0)          //竖屏
    {
        lcddev.dir = 0;   //竖屏
        lcddev.width = 240;
        lcddev.height = 320;

        lcddev.wramcmd = 0X2C;
        lcddev.setxcmd = 0X2A;
        lcddev.setycmd = 0X2B;
        DFT_SCAN_DIR = U2D_R2L; //从上到下，从右到左

    }
    else               //横屏
    {
        lcddev.dir = 1;   //横屏
        lcddev.width = 320;
        lcddev.height = 240;

        lcddev.wramcmd = 0X2C;
        lcddev.setxcmd = 0X2A;
        lcddev.setycmd = 0X2B;
        DFT_SCAN_DIR = L2R_U2D; //从左到右，从上到下

    }
    LCD_Scan_Dir (DFT_SCAN_DIR); //设置默认扫描方向；
}
/**
 * 清屏操作
 * @param color 填充色
 */
void LCD_Clear(uint16_t color)
{
    uint32_t index = 0;
    uint32_t totalpoint = lcddev.width;
    totalpoint *= lcddev.height;  //总点数
    LCD_SetCursor (0x00, 0x0000);   //设置光标位置
    ST7789_WriteRAM_Start ();     //写GRAM
    for (index = 0; index < totalpoint; index++)
    {
        LCD_WriteRAM (color);
    }
}
/**
 *指定区域填充单个颜色
 * @param sx
 * @param sy
 * @param ex
 * @param ey
 * @param color
 */
void LCD_Fill(uint16_t sx, uint16_t sy, uint16_t width, uint16_t height, uint16_t color)
{
	u32 len =0;
	u32 i;
	if(width >320 ) width =320;
	if(height >240 ) height =320;
	LCD_Set_Window(sx,sy,width,height);
	ST7789_WriteRAM_Start (); 
	len=width*height; 			//要写入的总字数
	for(i=0;i<len;i++)		
	{
			LCD_WriteRAM(color);
	}
	
}
/**
 * 指定区域填充色块,sx,sy,ex,ey 对标四个角
 * @param sx
 * @param sy
 * @param ex
 * @param ey
 * @param color
 */
void LCD_Color_Fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *color)
{
    uint16_t height, width;
    uint16_t i, j;
    width = ex - sx + 1;      //填充宽度
    height = ey - sy + 1;     //高度
	ST7789_WriteRAM_Start ();     //写入GRAM
    for (i = 0; i < height; i++)
    {
        LCD_SetCursor (sx, sy + i);     //光标位置
        
        for (j = 0; j < width; j++)
            LCD_WriteRAM (color[i * height + j]);     //写入数据
    }
}
/**
 * 画线
 * @param x1
 * @param y1
 * @param x2
 * @param y2
 */
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
    uint16_t t;
    int xerr = 0, yerr = 0, delta_x, delta_y, distance;
    int incx, incy, uRow, uCol;
    delta_x = x2 - x1; //计算坐标增量
    delta_y = y2 - y1;
    uRow = x1;
    uCol = y1;
    if (delta_x > 0)
        incx = 1; //设置单步方向
    else if (delta_x == 0)
        incx = 0; //垂直线
    else
    {
        incx = -1;
        delta_x = -delta_x;
    }
    if (delta_y > 0)
        incy = 1;
    else if (delta_y == 0)
        incy = 0; //水平线
    else
    {
        incy = -1;
        delta_y = -delta_y;
    }
    if (delta_x > delta_y)
        distance = delta_x; //选取基本坐标轴
    else
        distance = delta_y;
    for (t = 0; t <= distance + 1; t++) //画线输出
    {
        LCD_DrawPoint (uRow, uCol); //画点
        xerr += delta_x;
        yerr += delta_y;
        if (xerr > distance)
        {
            xerr -= distance;
            uRow += incx;
        }
        if (yerr > distance)
        {
            yerr -= distance;
            uCol += incy;
        }
    }
}
/**
 * 画矩形，x1,x2 y1 y2 为四脚坐标
 * @param x1
 * @param y1
 * @param x2
 * @param y2
 */
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
    LCD_DrawLine (x1, y1, x2, y1);
    LCD_DrawLine (x1, y1, x1, y2);
    LCD_DrawLine (x1, y2, x2, y2);
    LCD_DrawLine (x2, y1, x2, y2);
}
/**
 * 在指定位置画一个指定大小的圆
 * @param x0
 * @param y0    圆心
 * @param r  半径
 */
void Draw_Circle(uint16_t x0, uint16_t y0, uint8_t r)
{
    int a, b;
    int di;
    a = 0;
    b = r;
    di = 3 - (r << 1);             //ÅÐ¶ÏÏÂ¸öµãÎ»ÖÃµÄ±êÖ¾
    while (a <= b)
    {
        LCD_DrawPoint (x0 + a, y0 - b);             //5
        LCD_DrawPoint (x0 + b, y0 - a);             //0
        LCD_DrawPoint (x0 + b, y0 + a);             //4
        LCD_DrawPoint (x0 + a, y0 + b);             //6
        LCD_DrawPoint (x0 - a, y0 + b);             //1
        LCD_DrawPoint (x0 - b, y0 + a);
        LCD_DrawPoint (x0 - a, y0 - b);             //2
        LCD_DrawPoint (x0 - b, y0 - a);             //7
        a++;
        //Ê¹ÓÃBresenhamËã·¨»­Ô²
        if (di < 0)
            di += 4 * a + 6;
        else
        {
            di += 10 + 4 * (a - b);
            b--;
        }
    }
}
///**
// * 在指定位置显示一个字符
// * @param x     起始坐标x
// * @param y     起始坐标y
// * @param num   要显示的字符
// * @param size  字体大小  12/16
// * @param mode  叠加方式（1）  非叠加方式（0）
// */
//void LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint8_t size,uint8_t mode)
//{
//    uint8_t temp,t1,t;
//    uint16_t y0=y;
//    uint16_t colortemp=POINT_COLOR;
//    //设置窗口
//    num=num-' ';//得到偏移后的值
//    if(!mode) //非叠加方式
//    {
//        for(t=0;t<size;t++)
//        {
//            if(size==12)temp=asc2_1206[num][t];  //调用1206字体
//            else temp=asc2_1608[num][t];         //调用1608字体
//            for(t1=0;t1<8;t1++)
//            {
//                if(temp&0x80)POINT_COLOR=colortemp;     //判断是背景还是画笔
//                else POINT_COLOR=BACK_COLOR;
//                LCD_DrawPoint(x,y);
//                temp<<=1;
//                y++;
//                if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域
//                if((y-y0)==size)    //到达指定高度
//                {
//                    y=y0;
//                    x++;
//                    if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域
//                    break;
//                }
//            }
//        }
//    }else//叠加方式
//    {
//        for(t=0;t<size;t++)
//        {
//            if(size==12)temp=asc2_1206[num][t];  //调用1206字体
//            else temp=asc2_1608[num][t];         //调用1608字体
//            for(t1=0;t1<8;t1++)
//            {
//                if(temp&0x80)LCD_DrawPoint(x,y);
//                temp<<=1;
//                y++;
//                if(x>=lcddev.height){POINT_COLOR=colortemp;return;}//超区
//                if((y-y0)==size)
//                {
//                    y=y0;
//                    x++;
//                    if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区
//                    break;
//                }
//            }
//        }
//    }
//    POINT_COLOR=colortemp;
//}

///**
// * 在指定位置显示一个字符
// * @param x     起始坐标x
// * @param y     起始坐标y
// * @param num   要显示的字符
// * @param size  字体大小  32/48
// * @param mode  叠加方式（1）  非叠加方式（0）
// */
//void LCD_ShowChar(uint16_t x, uint16_t y, uint8_t num, uint8_t size, uint8_t mode)
//{
//    uint32_t temp, t1, t;
//    uint16_t y0 = y;
//    uint16_t colortemp = POINT_COLOR;
//    uint8_t List = size / 2;
//    //设置窗口
//    num = num - ' ';             //得到偏移后的值
//    if (!mode) //非叠加方式
//    {
//        for (t = 0; t < size; t++)
//        {
//            if (size == 32)
//            {
//                temp = asc_32[num][2 * t];
//                temp = (temp << 8) | asc_32[num][2 * t + 1];
//            }
//            else if (size == 48)
//            {
//                temp = asc_48[num][3 * t] & 0xFF;
//                temp = (temp << 8) | asc_48[num][3 * t + 1];
//                temp = (temp << 8) | asc_48[num][3 * t + 2];
//            }
//            for (t1 = 0; t1 < List; t1++)
//            {
//                if (size == 32)
//                {
//                    if (temp & 0x8000)
//                        POINT_COLOR = colortemp;     //判断是背景还是画笔
//                    else
//                        POINT_COLOR = BACK_COLOR;
//                }
//                else if (size == 48)
//                {
//                    if (temp & 0x800000)
//                        POINT_COLOR = colortemp;     //判断是背景还是画笔
//                    else
//                        POINT_COLOR = BACK_COLOR;
//                }
//                LCD_DrawPoint (x, y);
//                temp <<= 1;
//                y++;
//                if (x >= lcddev.width)
//                {
//                    POINT_COLOR = colortemp;
//                    return;
//                }     //超区域
//                if ((y - y0) == size)    //到达指定高度
//                {
//                    y = y0;
//                    x++;
//                    if (x >= lcddev.width)
//                    {
//                        POINT_COLOR = colortemp;
//                        return;
//                    }    //超区域
//                    break;
//                }
//            }
//        }
//    }
//    else    //叠加方式
//    {
//        for (t = 0; t < size; t++)
//        {
//            if (size == 32)
//            {
//                temp = asc_32[num][2 * t];
//                temp = (temp << 8) | asc_32[num][2 * t + 1];
//            }
//            else if (size == 48)
//            {
//                temp = asc_48[num][3 * t] & 0xFF;
//                temp = (temp << 8) | asc_48[num][3 * t + 1];
//                temp = (temp << 8) | asc_48[num][3 * t + 2];
//            }
//            for (t1 = 0; t1 < List; t1++)
//            {
//                if (size == 32)
//                {
//                    if (temp & 0x8000)
//                        LCD_DrawPoint (x, y);
//                }
//                else if (size == 48)
//                {
//                    if (temp & 0x800000)
//                        LCD_DrawPoint (x, y);
//                }

//                temp <<= 1;
//                y++;
//                if (x >= lcddev.height)
//                {
//                    POINT_COLOR = colortemp;
//                    return;
//                }     //超区
//                if ((y - y0) == size)
//                {
//                    y = y0;
//                    x++;
//                    if (x >= lcddev.width)
//                    {
//                        POINT_COLOR = colortemp;
//                        return;
//                    }     //超区
//                    break;
//                }
//            }
//        }
//    }
//    POINT_COLOR = colortemp;
//}
/**
 * 用扫描的方式，在指定位置显示一个字符
 * @param x		起始
 * @param y		起始
 * @param 	
 * @param size  字体大小  32/48
 * @param color 颜色
 */
 
void LCD_ShowChar(uint16_t x, uint16_t y,uint8_t num,uint16_t size, uint16_t color)
{
	uint32_t i;
	uint8_t j;
	uint32_t len=0;
	uint16_t width;
	uint16_t height;
	width =  size/2;
	height = size;
	num = num - ' '; 
	if((size == 10) || (size ==11))
	{
		width 	=  32;
		height 	= 32;
	}
//    LCD_Scan_Dir(L2R_U2D);//设置扫描方向
    LCD_Set_Window(x,y,width,height);   //设置窗口大小    
//    LCD_SetCursor(x,y);//设置光标
	ST7789_WriteRAM_Start();   	//开始写入GRAM	
    len=width*height/8; 			//要写入的总字数
	if(size ==32)
	{
		for(i=0;i<len;i++)		//按多少个字节来
		{
			for(j=0;j<8;j++)
			{
				if(asc_32[num][i]&(0x80 >>j))
				LCD_WriteRAM(color);
				else
					LCD_WriteRAM(BLACK);
			}											
		}
	}
	else if(size == 48)
	{
		for(i=0;i<len;i++)		//按多少个字节来
		{
			for(j=0;j<8;j++)
			{
				if(asc_48[num][i] &(0x80 >>j))
				LCD_WriteRAM(color);
				else
					LCD_WriteRAM(BLACK);				
			}											
		}	
	}
//	else if(size == 11)
//	{
//		for(i=0;i<128;i++)		//按多少个字节来
//		{
//			for(j=0;j<8;j++)
//			{
//				if(asc_FuHao[0][i]&(0x80 >>j))
//				LCD_WriteRAM(color);
//				else
//					LCD_WriteRAM(BLACK);
//			}											
//		}
//	}
//	else if(size == 10)
//	{
//		for(i=0;i<128;i++)		//按多少个字节来
//		{
//			for(j=0;j<8;j++)
//			{
//				if(asc_FuHao[1][i]&(0x80 >>j))
//				LCD_WriteRAM(color);
//				else
//					LCD_WriteRAM(BLACK);
//			}											
//		}
//	}
	else if(size == 64)
	{	
		num = num + ' ' - '0'; 
		for(i=0;i<256;i++)		//按多少个字节来
		{
			for(j=0;j<8;j++)
			{
				if(asc_Number64[num][i]&(0x80 >>j))
				LCD_WriteRAM(color);
				else
					LCD_WriteRAM(BLACK);
			}											
		}	
	}
		
//	LCD_Set_Window(0,0,lcddev.width,lcddev.height); //最后还原窗口大小
}

/**
 *  m^n 次方
 * @param m
 * @param n
 * @return
 */
uint32_t LCD_Pow(uint8_t m, uint8_t n)
{
    uint32_t result = 1;
    while (n--)
        result *= m;
    return result;
}
/**
 * 显示数字，高位0不显示
 * @param x
 * @param y
 * @param num   数值
 * @param len   位数
 * @param size  字体大小
 */
void LCD_ShowNum(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t size)
{
    uint8_t t, temp;
    uint8_t enshow = 0;

	
    for (t = 0; t < len; t++)
    {
        temp = (num / LCD_Pow (10, len - t - 1)) % 10;
        if (enshow == 0 && t < (len - 1))
        {
            if (temp == 0)
            {
                LCD_ShowChar (x + (size / 2) * t, y, ' ', size, 0);
                continue;
            }
            else
                enshow = 1;

        }
        LCD_ShowChar (x + (size / 2) * t, y, temp + '0', size, 0);
    }
}
/**
 * 显示数字，高位0显示
 * @param x     起始x
 * @param y     起始y
 * @param num   数值
 * @param len   长度
 * @param size  字体大小
 * @param mode
 * [7]:0,不填充；1，填充0
 * [6:1]: 保留
 * [0]:0,非叠加显示；1，叠加显示
 */
void LCD_ShowxNum(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t size, uint8_t mode ,uint16_t color)
{
    uint8_t t, temp;
    uint8_t enshow = 0;
	POINT_COLOR = WHITE;
    for (t = 0; t < len; t++)
    {
        temp = (num / LCD_Pow (10, len - t - 1)) % 10;
        if (enshow == 0 && t < (len - 1))
        {
            if (temp == 0)
            {
                if (mode & 0X80)
                    LCD_ShowChar (x + ((size / 2) * t), y, '0', size, color);
                else
                    LCD_ShowChar (x + ((size / 2) * t), y, ' ', size, color);
                continue;
            }
            else
                enshow = 1;
        }
        LCD_ShowChar (x + ((size / 2) * t), y, temp + '0', size, color);
    }
}
/**
 * 显示字符串
 * @param x     起始x
 * @param y     起始y
 * @param width  区域宽
 * @param height 区域高
 * @param size   字体大小
 * @param  *p    字符串起始地址
 */
void LCD_ShowString(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t size, uint8_t *p)
{
    uint8_t x0 = x;
    width += x;
    height += y;
	if(size == 33)
    {
        size =32;
        POINT_COLOR =RED;
    }
	else if(size == 34)
	{
		size =32;
        POINT_COLOR =GREEN;
	}
	else POINT_COLOR = WHITE;
    while ((*p <= '~') && (*p >= ' '))     //判断是不是非法字符
    {
        if (x >= width)
        {
            x = x0;
            y += size;
        }
        if (y >= height)
            break;     //退出
        LCD_ShowChar (x, y, *p, size, POINT_COLOR);
        x += size / 2;
        p++;
    }
}
//void LCD_ShowString(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t size, uint8_t *p)
//{
//    uint8_t x0 = x;
//    width += x;
//    height += y;
//	if(size == 33)
//    {
//        size =32;
//        POINT_COLOR =RED;
//    }
//	else POINT_COLOR = WHITE;
//    while ((*p <= '~') && (*p >= ' '))     //判断是不是非法字符
//    {
//        if (x >= width)
//        {
//            x = x0;
//            y += size;
//        }
//        if (y >= height)
//            break;     //退出
//        LCD_ShowChar (x, y, *p, size, 0);
//        
//        p++;
//    }
//}
/**
 * 设置窗口
 * @param sx    起始位置
 * @param sy
 * @param width     宽度
 * @param height    高度
 */
void LCD_Set_Window(uint16_t sx, uint16_t sy, uint16_t width, uint16_t height)
{
    width = sx + width - 1;
    height = sy + height - 1;

    ST7789_WRReg (lcddev.setxcmd);
    ST7789_WRData (sx >> 8);
    ST7789_WRData (sx & 0XFF);
    ST7789_WRData (width >> 8);
    ST7789_WRData (width & 0XFF);
    ST7789_WRReg (lcddev.setycmd);
    ST7789_WRData (sy >> 8);
    ST7789_WRData (sy & 0XFF);
    ST7789_WRData (height >> 8);
    ST7789_WRData (height & 0XFF);
}
